package br.com.projeco.web;

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import br.com.projeco.biblioteca.mensageria.config.Ativador;
import br.com.projeco.biblioteca.mensageria.config.ResolutorTipo;
import br.com.projeco.biblioteca.mensageria.mensagem.MensagemRequestBase;
import br.com.projeco.biblioteca.mensageria.mensagem.MensagemResponseBase;
import br.com.projeco.biblioteca.mensageria.servico.IServicoMensageria;

import com.google.gson.Gson;
import com.google.gson.JsonObject;

@SuppressWarnings("serial")
public class ProjecoServlet extends HttpServlet {
	
	public void init() {

		try {

			super.init();
			Set<String> pacotesConhecidos = new HashSet<String>();
			pacotesConhecidos.add("br.com.projeco");
			ResolutorTipo.getInstance(pacotesConhecidos);

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws IOException {
		
		JsonObject jsonObject = new JsonObject();

		// � uma a��o?
		String acao = request.getParameter("acao");
		if (acao != null) {
			if (acao.equals("executar")) {
				// Obtenho o tipo da mensagem que deve ser usada
				String tipoMensagem = request.getParameter("tipoMensagem");

				// Mensagem de resposta padrão
				MensagemResponseBase mensagemResponse = new MensagemResponseBase();

				// Obtenho os valores passados
				String json = request.getParameter("valores");
				// Se não vier um JSON válido, crio um vazio
				json = (json == null || !json.contains("{")) ? "{}" : json;

				try {

					// Obtenho a classe da mensagem
					MensagemRequestBase mensagemRequest = new MensagemRequestBase();

					if (tipoMensagem != null) {
						Class<?> classeMensagem = ResolutorTipo
								.get(tipoMensagem);

						Gson gson = new Gson();

						mensagemRequest = (MensagemRequestBase) gson.fromJson(
								json, classeMensagem);

						// Obtenho a sessão
						HttpSession session = request.getSession();
						mensagemRequest.setCodigoSessao((String) session
								.getAttribute("codigoSessao"));

						// Obtenho uma instancia da mensageria através do
						// ativador
						IServicoMensageria servicoMensageria = Ativador
								.get(IServicoMensageria.class);
						// Envio a requisicão para o serviço
						mensagemResponse = servicoMensageria
								.processarMensagem(mensagemRequest);
						
						jsonObject.addProperty("status", "OK");
						
					}
					
				}catch (Exception e) {
						// TODO Auto-generated catch block
						jsonObject.addProperty("status", "Erro");
						jsonObject.addProperty("msg", e.toString());
				}
				
				response.setContentType("application/json");
				response.getWriter().print(json);
			}				
		}
	}
}

